<?php
class GrupoUsuariosDAO extends GenericDAO  {
	private $contexto;
	
	function __construct() {
		$this->tabela["alteracao"] = array(	"id" 	=> 23, 
											"nome" 	=> strtolower(substr(get_class(), 0, -3)));
		
		$this->tabela["consulta"]  = array(	"id" 	=> 27,
											"nome" 	=> "vw_" . strtolower(substr(get_class(), 0, -3)));
		$this->contexto = true;
	}
	
	private function sqlContexto() {
		return ' exists (select grupo from usu_x_grupo where usuario = :usuario and ehSubGrupo(usu_x_grupo.grupo, vw_grupousuarios.id))';		
	}
	
	public function limitarContexto($limitar) {
		$this->contexto = $limitar;
	}
	
	public function consultar($where, $params, $orderLimit = "") {
		// contexto
		if ($this->contexto) {
			if ($where == '') {
				$where = " where ";
			} else {
				$where .= " and ";
			} 
			$where .= $this->sqlContexto();
			$params["usuario"] = $_SESSION["usuario"]["id"];
		}
		// fim contexto

		return parent::consultar($where, $params, $orderLimit); 
	}
	
	public function consultarPK($valor) {
		if (is_numeric($valor)) {
	    	$where = " where id = :id";
	    	$params['id'] = $valor;
		} else {
			$where = " where id is null";
			$params = null;
		}
	    
	    // contexto
	    if ($this->contexto) {
	    	$where .= " and " . $this->sqlContexto();
			$params["usuario"] = $_SESSION["usuario"]["id"];
	    }
	    // fim contexto
	    
	    return $this->consultar($where, $params);
	}

	public function consultarGrupo($valor, $orderLimit = "") {
	    $where = " where grupo like :valor";
	    $params['valor'] = $valor;
	    
	    // contexto
	    if ($this->contexto) {
	    	$where .= " and " . $this->sqlContexto();
			$params["usuario"] = $_SESSION["usuario"]["id"];
	    }
	    // fim contexto
	    
	    return $this->consultar($where, $params, $orderLimit);
	}
	
	public function contarFilhos($grupo) {
		if (is_null($grupo)) {
			$sql = " where subde is null";
			$params = null;
		} else {
			$sql = " where subde = :subde";
			$params['subde'] = $grupo;
		}
	    
		// contexto
	    if ($this->contexto) {
	    	$sql .= " and " . $this->sqlContexto();
			$params["usuario"] = $_SESSION["usuario"]["id"];
	    }
	    // fim contexto
	     
	    return $this->contarRegistros($sql, $params);
	}

	public function ehSubGrupo($grupo, $subgrupo) {
		if ($subgrupo == "null") {
			throw new Exception("Não é possível verificar a filiação de null");
		}
		$sql = "select ehSubGrupo(:grupo, :subgrupo) res";
		$params["grupo"] = $grupo;
		$params["subgrupo"] = $subgrupo;
		$res = $this->execQuery($sql, $params);
		return $res[0]['res'];
	}
	
	public function consultarFilhos($grupo, $orderLimit = "") {
		if (is_null($grupo)) {
			$where = " where subde is null ";
			$params = null;
		} else {
			$where = " where subde = :subde ";
			$params["subde"] = $grupo;
		}

		return $this->consultar($where, $params, $orderLimit);
	}
	
	public function consultarArvore($grupo = null) {
		$head = $this->consultarFilhos($grupo);
		foreach ($head as $id => $filho) {
			$head[$id]["subs"] = $this->consultarArvore($filho["id"]);
		}
		return $head;
	}
	
	public function estaNoContexto($grupoid) {
		$usuGrpDao = new Usu_x_GrupoDAO();
		// todo: verificar contexto do usu_x_grupo
		$grupos = $usuGrpDao->consultarGrupos($_SESSION['usuario']['id']);
		$res = false;
		foreach ($grupos as $grp) {
			$res = $this->ehSubGrupo($grp['grupoid'], $grupoid);
			if ($res) break;
		}
		return $res;
	}
		
	public function inserir($registro, $finalizarTransacao = true) {
		$res = null;
		if ($this->inserirRegistro($registro, false)) {
			$res = $registro;
			$res['id'] = $this->ultimoId();
		}
		return $res;
	}
	
	public function excluir($id, $finalizarTransacao = true) {
		$pk['id'] = $id;
		return $this->excluirRegistro($pk, $finalizarTransacao);
	}
	
	public function alterar($registro, $finalizarTransacao = true) {
		$reg['grupo'] = "'" . $registro['grupo'] . "'";
		$reg['subde'] = $registro['subde'];
		$pk['id']	  = $registro['id'];
		return $this->alterarRegistro($reg, $pk, $finalizarTransacao) ? $registro : null;
	}
}
?>